#include <stdio.h>
#include <omp.h>

// 函数内部使用静态变量和threadprivate
int increment_counter_2()
{
    static int counter = 0;
    #pragma omp threadprivate(counter)
    counter++;
    return(counter);
}

int main()
{
    int i;
    
    // 设置线程数为4
    omp_set_num_threads(4);
    
    printf("OpenMP threadprivate 函数内静态变量验证程序\n");
    printf("-------------------------------------------\n\n");
    
    // 第一个并行区域
    printf("第一个并行区域：\n");
    #pragma omp parallel
    {
        int tid = omp_get_thread_num();
        
        // 每个线程调用increment_counter_2三次
        for (i = 0; i < 3; i++) {
            int val = increment_counter_2();
            #pragma omp critical
            {
                printf("线程 %d: counter = %d\n", tid, val);
            }
        }
    }
    
    // 第二个并行区域，检查值是否持久
    printf("\n第二个并行区域：\n");
    #pragma omp parallel
    {
        int tid = omp_get_thread_num();
        
        // 再次调用函数，检查值是否被保持
        int val = increment_counter_2();
        #pragma omp critical
        {
            printf("线程 %d: counter = %d\n", tid, val);
        }
    }
    
    // 单线程测试，查看主线程的值
    printf("\n单线程测试：\n");
    for (i = 0; i < 2; i++) {
        int val = increment_counter_2();
        printf("主线程: counter = %d\n", val);
    }
    
    // 最后一个并行区域，再次检查所有线程的值
    printf("\n最后一个并行区域：\n");
    #pragma omp parallel
    {
        int tid = omp_get_thread_num();
        int val = increment_counter_2();
        #pragma omp critical
        {
            printf("线程 %d: counter = %d\n", tid, val);
        }
    }
    
    return 0;
}